package gestordeentidades;

import entidades.Ancora;
import entidades.Cor;
import entidades.Decorador;
import entidades.DesenhoDinamico;
import entidades.Estilo;
import entidades.Familia;
import entidades.Ponto;
import entidades.Rectangulo;
import entidades.Telha;
import entidades.Textura;
import entidades.TipoTelha;
import gestordeentidades.persistance.database.DataBase;
import java.lang.reflect.Field;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import static org.junit.Assert.*;

/**
 *
 * @author davidrex
 */
public class GestorDeEntidadesLoadTestes {
    @BeforeClass
    public static void setUpClass() {/*Iniciar class*/}

    @AfterClass
    public static void tearDownClass() {/*Apagar class*/}

    @Before
    public void setUp() {
        DataBase.apagarBaseDeDados();
    }

    @After
    public void tearDown() {
        removerSingleton();
    }
    
    public void removerSingleton() {
        try {
            Field singleton = GestorDeEntidades.class.getDeclaredField("singleton");
            singleton.setAccessible(true);
            singleton.set(null, null);
        } catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException ex) {
            System.err.println(ex);
        }
    }

    /**
     * Teste inicial
     */
    @Test
    public void teste1() {
        IGestor instance = GestorDeEntidades.getInstance();
        assertNotNull(instance);
    }
    
    @Test
    public void testeLoadPonto() {
        IGestor instance = GestorDeEntidades.getInstance();
        Ponto p = new Ponto(20, 30);
        p.registarNovaEntidade();
        instance.commit();
        
        removerSingleton();
        instance = GestorDeEntidades.getInstance();
        
        assertTrue(instance.procurarPorTodasAsEntidadesComoColecao(Ponto.class).size() == 1);
        
        Ponto procurarEntidadePeloID = instance.procurarEntidadePeloID(Ponto.class, 1);
        assertNotNull(procurarEntidadePeloID);
        
        assertTrue(procurarEntidadePeloID.equals(p));
    }
    
    @Test
    public void testeLoadCor() {
        IGestor instance = GestorDeEntidades.getInstance();
        Cor p = new Cor(15d, 16d, 17d, 1d);
        p.registarNovaEntidade();
        instance.commit();
        
        removerSingleton();
        instance = GestorDeEntidades.getInstance();
        
        assertTrue(instance.procurarPorTodasAsEntidadesComoColecao(Cor.class).size() == 1);
        
        Cor procurarEntidadePeloID = instance.procurarEntidadePeloID(Cor.class, 1);
        assertNotNull(procurarEntidadePeloID);
        
        assertTrue(procurarEntidadePeloID.getRed()== 15d);
        assertTrue(procurarEntidadePeloID.getGreen()== 16d);
        assertTrue(procurarEntidadePeloID.getBlue()== 17d);
        assertTrue(procurarEntidadePeloID.getOpacity()== 1d);
    }

    @Test
    public void testeLoadTipoDeTelha() {
        IGestor instance = GestorDeEntidades.getInstance();
        TipoTelha p = new TipoTelha("tipo teste");
        p.registarNovaEntidade();
        instance.commit();
        
        removerSingleton();
        instance = GestorDeEntidades.getInstance();
        
        assertTrue(instance.procurarPorTodasAsEntidadesComoColecao(TipoTelha.class).size() == 1);
        
        TipoTelha procurarEntidadePeloID = instance.procurarEntidadePeloID(TipoTelha.class, 1);
        assertNotNull(procurarEntidadePeloID);
        
        assertTrue(procurarEntidadePeloID.getNome().equals("tipo teste"));
    }

    @Test
    public void testeLoadFamilia() {
        IGestor instance = GestorDeEntidades.getInstance();
        
        Cor linhaFamilia = new Cor();
        linhaFamilia.registarNovaEntidade();
        Cor textoFamilia = new Cor();
        textoFamilia.registarNovaEntidade();
        Textura texturaFamilia = new Textura(2, "caminho");
        texturaFamilia.registarNovaEntidade();
        
        Familia p = new Familia("familia", linhaFamilia, textoFamilia, texturaFamilia);
        p.registarNovaEntidade();
        instance.commit();
        
        removerSingleton();
        instance = GestorDeEntidades.getInstance();
        
        assertTrue(instance.procurarPorTodasAsEntidadesComoColecao(Familia.class).size() == 1);
        
        Familia procurarEntidadePeloID = instance.procurarEntidadePeloID(Familia.class, 1);
        assertNotNull(procurarEntidadePeloID);
        
        assertTrue(procurarEntidadePeloID.getNome().equals("familia"));
    }
    
    @Test
    public void testeLoadTextura() {
        IGestor instance = GestorDeEntidades.getInstance();
        Textura p = new Textura(40, "caminho");
        p.registarNovaEntidade();
        instance.commit();
        
        removerSingleton();
        instance = GestorDeEntidades.getInstance();
        
        assertTrue(instance.procurarPorTodasAsEntidadesComoColecao(Textura.class).size() == 1);
        
        Textura procurarEntidadePeloID = instance.procurarEntidadePeloID(Textura.class, 1);
        assertNotNull(procurarEntidadePeloID);
        
        assertTrue(procurarEntidadePeloID.getCaminhoDoFicheiro().equals("caminho"));
        assertTrue(procurarEntidadePeloID.getZ() == 40);
    }
    
    @Test
    public void testeLoadRectangulo() {
        IGestor instance = GestorDeEntidades.getInstance();
        Ponto origem = new Ponto(30f, 50f);
        origem.registarNovaEntidade();
        Rectangulo p = new Rectangulo(origem, 100f, 300f, 0f);
        p.registarNovaEntidade();
        instance.commit();
        
        removerSingleton();
        instance = GestorDeEntidades.getInstance();
        
        assertTrue(instance.procurarPorTodasAsEntidadesComoColecao(Rectangulo.class).size() == 1);
        
        Rectangulo procurarEntidadePeloID = instance.procurarEntidadePeloID(Rectangulo.class, 1);
        assertNotNull(procurarEntidadePeloID);
        
        assertTrue(procurarEntidadePeloID.equals(p));
    }
    
    @Test
    public void testeLoadEstilo() {
        IGestor instance = GestorDeEntidades.getInstance();
        Cor c = new Cor(1d, 1d, 1d, 1d);
        c.registarNovaEntidade();
        
        Cor linhaFamilia = new Cor();
        linhaFamilia.registarNovaEntidade();
        Cor textoFamilia = new Cor();
        textoFamilia.registarNovaEntidade();
        Textura texturaFamilia = new Textura(2, "caminho");
        texturaFamilia.registarNovaEntidade();
        Familia f = new Familia("teste F", linhaFamilia, textoFamilia, texturaFamilia);
        
        f.registarNovaEntidade();
        Textura t = new Textura(10, "caminho");
        t.registarNovaEntidade();
        Estilo e = new Estilo(f, "nome estilo", c, c, t);
        e.registarNovaEntidade();
        instance.commit();
        
        removerSingleton();
        instance = GestorDeEntidades.getInstance();
        
        assertTrue(instance.procurarPorTodasAsEntidadesComoColecao(Estilo.class).size() == 1);
        
        Estilo procurarEntidadePeloID = instance.procurarEntidadePeloID(Estilo.class, 1);
        assertNotNull(procurarEntidadePeloID);
        
        assertTrue(procurarEntidadePeloID.equals(e));
    }
    
    @Test
    public void testeLoadTelha() {
        IGestor instance = GestorDeEntidades.getInstance();
        Ponto origem = new Ponto(30f, 50f);
        origem.registarNovaEntidade();
        Rectangulo rectangulo = new Rectangulo(origem, 100f, 300f, 0f);
        rectangulo.registarNovaEntidade();
        TipoTelha tipoTelha = new TipoTelha("tipo teste");
        tipoTelha.registarNovaEntidade();
        Cor c = new Cor(1d, 1d, 1d, 1d);
        c.registarNovaEntidade();
        
        Cor linhaFamilia = new Cor();
        linhaFamilia.registarNovaEntidade();
        Cor textoFamilia = new Cor();
        textoFamilia.registarNovaEntidade();
        Textura texturaFamilia = new Textura(2, "caminho");
        texturaFamilia.registarNovaEntidade();
        Familia f = new Familia("teste F", linhaFamilia, textoFamilia, texturaFamilia);
        
        f.registarNovaEntidade();
        Textura t = new Textura(10, "caminho");
        t.registarNovaEntidade();
        Estilo e = new Estilo(f, "nome estilo", c, c, t);
        e.registarNovaEntidade();
        DesenhoDinamico desenho = new DesenhoDinamico(0, "treta");
        desenho.registarNovaEntidade();
        Telha telha  = new Telha(f, rectangulo, tipoTelha, e, desenho);
        telha.registarNovaEntidade();
        instance.commit();
        
        removerSingleton();
        instance = GestorDeEntidades.getInstance();
        
        assertTrue(instance.procurarPorTodasAsEntidadesComoColecao(Telha.class).size() == 1);
        
        Telha procurarEntidadePeloID = instance.procurarEntidadePeloID(Telha.class, 1);
        assertNotNull(procurarEntidadePeloID);
        assertTrue(procurarEntidadePeloID.equals(telha));
        
    }

    @Test
    public void testeLoadAncora() {
        IGestor instance = GestorDeEntidades.getInstance();
        Ponto ancoraPonto = new Ponto(60f, 20f);
        ancoraPonto.registarNovaEntidade();
        Ponto origem = new Ponto(30f, 50f);
        origem.registarNovaEntidade();
        Rectangulo rectangulo = new Rectangulo(origem, 100f, 300f, 0f);
        rectangulo.registarNovaEntidade();
        TipoTelha tipoTelha = new TipoTelha("tipo teste");
        tipoTelha.registarNovaEntidade();
        Cor c = new Cor(1d, 1d, 1d, 1d);
        c.registarNovaEntidade();
        
        Cor linhaFamilia = new Cor();
        linhaFamilia.registarNovaEntidade();
        Cor textoFamilia = new Cor();
        textoFamilia.registarNovaEntidade();
        Textura texturaFamilia = new Textura(2, "caminho");
        texturaFamilia.registarNovaEntidade();
        Familia f = new Familia("teste F", linhaFamilia, textoFamilia, texturaFamilia);
        
        f.registarNovaEntidade();
        Textura t = new Textura(10, "caminho");
        t.registarNovaEntidade();
        Estilo e = new Estilo(f, "nome estilo", c, c, t);
        e.registarNovaEntidade();
        DesenhoDinamico desenho = new DesenhoDinamico(0, "treta");
        desenho.registarNovaEntidade();
        Telha telha  = new Telha(f, rectangulo, tipoTelha, e, desenho);
        telha.registarNovaEntidade();
        Ancora ancora = new Ancora(origem, telha);
        ancora.registarNovaEntidade();
        instance.commit();
        
        removerSingleton();
        instance = GestorDeEntidades.getInstance();
        
        assertTrue(instance.procurarPorTodasAsEntidadesComoColecao(Ancora.class).size() == 1);
        
        Ancora procurarEntidadePeloID = instance.procurarEntidadePeloID(Ancora.class, 1);
        assertNotNull(procurarEntidadePeloID);
        assertTrue(procurarEntidadePeloID.equals(ancora));
    }
    
    @Test
    public void testeLoadDesenhoDinamico() {
        IGestor instance = GestorDeEntidades.getInstance();
        
        DesenhoDinamico desenho = new DesenhoDinamico(0, "treta");
        desenho.registarNovaEntidade();
        instance.commit();
        
        removerSingleton();
        instance = GestorDeEntidades.getInstance();
        
        assertTrue(instance.procurarPorTodasAsEntidadesComoColecao(DesenhoDinamico.class).size() == 1);
        
        DesenhoDinamico procurarEntidadePeloID = instance.procurarEntidadePeloID(DesenhoDinamico.class, 1);
        assertNotNull(procurarEntidadePeloID);
        assertTrue(procurarEntidadePeloID.equals(desenho));
    }
    
    @Test
    public void testeLoadDecorador() {
        IGestor instance = GestorDeEntidades.getInstance();
        Ponto origem = new Ponto(30f, 50f);
        origem.registarNovaEntidade();
        Rectangulo rectangulo = new Rectangulo(origem, 100f, 300f, 0f);
        rectangulo.registarNovaEntidade();
        TipoTelha tipoTelha = new TipoTelha("tipo teste");
        tipoTelha.registarNovaEntidade();
        Cor c = new Cor(1d, 1d, 1d, 1d);
        c.registarNovaEntidade();
        
        Cor linhaFamilia = new Cor();
        linhaFamilia.registarNovaEntidade();
        Cor textoFamilia = new Cor();
        textoFamilia.registarNovaEntidade();
        Textura texturaFamilia = new Textura(2, "caminho");
        texturaFamilia.registarNovaEntidade();
        Familia f = new Familia("teste F", linhaFamilia, textoFamilia, texturaFamilia);
        
        f.registarNovaEntidade();
        Textura t = new Textura(10, "caminho");
        t.registarNovaEntidade();
        Estilo e = new Estilo(f, "nome estilo", c, c, t);
        e.registarNovaEntidade();
        DesenhoDinamico desenho = new DesenhoDinamico(0, "treta");
        desenho.registarNovaEntidade();
        
        Telha telha  = new Telha(f, rectangulo, tipoTelha, e, desenho);
        telha.registarNovaEntidade();
        Decorador decorador = new Decorador("Decorador", telha, null, null,null);
        decorador.registarNovaEntidade();
        instance.commit();
        
        removerSingleton();
        instance = GestorDeEntidades.getInstance();
        
        assertTrue(instance.procurarPorTodasAsEntidadesComoColecao(Decorador.class).size() == 1);
        
        Decorador procurarEntidadePeloID = instance.procurarEntidadePeloID(Decorador.class, 1);
        assertNotNull(procurarEntidadePeloID);
    }

    
}

